#include <iostream>
#include <signal.h>
#include <unistd.h>

using std::cout;
using std::endl;

void sig_handle(int sig_num, siginfo_t *info, void *p)
{
    printf("before sig, sig num is %d\n", sig_num); 
    printf("signum is %d, pid is %d, uid is %d\n", sig_num, info->si_pid, info->si_uid);
    sleep(3);
    printf("after sig, sig num is %d\n", sig_num); 
}

int main(int args, char *argv[])
{
    struct sigaction act{};
    /* 
    struct sigaction {
        void     (*sa_handler)(int);
        void     (*sa_sigaction)(int, siginfo_t *, void *);
        sigset_t   sa_mask;
        int        sa_flags;
        void     (*sa_restorer)(void);
    };
    sa_flags参数：
        SA_SIGINFO: 设置信号处理函数为 sa_sigaction，如果不设置，信号处理函数会为sa_handler
        SA_NODEFER: 可以被相同的信号打断
        SA_RESTART: 如果不设置此值，当发生信号时，系统调用会返回错误，然后处理信号; 设置之后，首先处理信号，然后继续处理系统调用 
        SA_RESETHAND: 重设信号处理函数为默认函数
    sa_mask参数:
        设置当前信号发生时，要阻塞的其他信号
    */
    act.sa_flags = SA_SIGINFO;
    act.sa_sigaction = sig_handle;
    // 清空 要阻塞的信号集合
    sigemptyset(&act.sa_mask); 
    // 设置到阻塞的信号
    sigaddset(&act.sa_mask, SIGQUIT);
    // 要处理的信号，  信号处理结构体， 旧信号结构体
    sigaction(SIGINT, &act, nullptr);
    while(1);
    return 0;
}